#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include <cstdio>

// void *threadrun(void *args)
// {
//     std::string name = (const char*)args;
//     while(true)
//     {
//         sleep(1);
//         std::cout << "我是新线程, name: " << name  << "; pid : " << getpid() << std::endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");

//     while(true)
//     {
//         std::cout << "我是主线程" << ", pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }


// void *threadrun(void *args)
// {
//     std::string name = (const char*)args;
//     while(true)
//     {
//         sleep(1);
//         std::cout << "我是新线程, name: " << name  << "; pid : " << getpid() << std::endl;
//         int a = 0;
//         a /= 0;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");

//     whil`e(true)
//     {
//         std::cout << "我是主线程" << ", pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// void hello()
// {
//     while(true)
//     {
//         std::cout << "新线程, hello world" << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t(hello);

//     while(true)
//     {
//         std::cout << "我是主线程..." << ", pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     t.join();
//     return 0;
// }

////////////////////////////////////////////////////////////////////////////////////

// int flag = 100;

// void showid(pthread_t &tid)
// {
//     printf("tid: 0x%lx\n", tid);
// }
// // 可重入函数
// std::string Formattid(const pthread_t &tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid); // 格式化打印
//     return id;
// }

// // 线程执行的函数入口
// void *routine(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     pthread_t tid = pthread_self(); // 获得线程id
//     int cnt = 5;
//     while(cnt)
//     {
//         std::cout << "我是一个新线程, name: " << name << ", 我的id是: " << Formattid(tid) << std::endl;
//         sleep(1);
//         cnt--;
//         flag++;
//     }
//     return (void*)100; // 暂时表示进程退出时的退出码
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, routine, (void*)"thread-1");
//     (void)n;

//     showid(tid);
    
//     int cnt = 5;
//     while(cnt)
//     {
//         std::cout << "我是main线程, name: main thread" << ", 我的id是: " 
//             << Formattid(pthread_self()) << ", flag: " << flag << std::endl;
//         sleep(1);
//         cnt--;
//     }
    
//     void *ret = nullptr;
//     pthread_join(tid, &ret); // 等待进程, ret获得新线程退出时的退出码
//     std::cout <<  "ret is : " << (long long int)ret << std::endl;

//     return 0;
// }

////////////////////////////////////////////////////////////////////////////////////

// void *routine(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     int cnt = 10;
//     while(cnt--)
//     {
//         std::cout << "新线程name: " << name << std::endl;
//         sleep(1);
//     }
//     return (void*)10;
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, routine , (void*)"thread-1");
    
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << "main线程 " << std::endl;
//         sleep(1);
//     }

//     void* ret = nullptr;
//     pthread_join(tid, &ret);
//     std::cout << "新线程结束, 退出码: " << (long long)ret << std::endl;
//     return 0;
// }

////////////////////////////////////////////////////////////////////////////////////


class Task
{
public:
    Task(int a, int b):_a(a), _b(b){}

    int Execute()
    {
        return _a + _b;
    }
    ~Task(){}
private:
    int _a;
    int _b;
};

class Result
{
public:
    Result(int result):_result(result){}

    int GetResult() {return _result;}

    ~Result(){}
private:
    int _result;
};

void *routine(void *args)
{
    Task *t = static_cast<Task*>(args);
    sleep(1);

    Result *res = new Result(t->Execute());
    sleep(1);

    return res;
}

int main()
{
    pthread_t tid;
    Task *t = new Task(10, 20);
    pthread_create(&tid, nullptr, routine , t); // 线程传递的参数可以是任意类型, 包括自定义对象
    
    int cnt = 5;
    while(cnt--)
    {
        std::cout << "main线程 " << std::endl;
        sleep(1);
    }

    Result* ret = nullptr;
    pthread_join(tid, (void**)&ret);
    int n = ret->GetResult(); 
    std::cout << "新线程结束, 运行结果: " << n << std::endl;
    return 0;
}